草庐IT

C++ 11:std::thread池化?

全部标签

c++ - 如何可移植地将 std::system_error 异常与 std::errc 值进行比较?

据我所知,以可移植的方式检查system_error条件的最佳实践之一是将它们的code()值与std::errc枚举。但是,当我尝试运行以下代码时,这似乎不起作用。#include#include#includeintmain(){try{throwstd::system_error(ENOENT,std::system_category());}catch(std::system_errorconst&e){assert(e.code()==std::errc::no_such_file_or_directory);//我是不是误解了这些诊断错误的工作原理,还是我做错了什么?如何将

c++ - 从 char* 初始化 std::string 而不复制

我遇到这样一种情况,我需要处理大量(许多GB)数据:通过附加许多较小的(Cchar*)字符串构建一个大字符串修剪字符串将字符串转换为C++conststd::string进行处理(只读)重复每次迭代中的数据都是独立的。我的问题是,我想尽量减少(如果可能的话消除)堆分配的内存使用量,因为目前这是我最大的性能问题。有没有一种方法可以将C字符串(char*)转换为STLC++字符串(std::string)而无需std::string在内部分配/复制数据?或者,我可以使用stringstreams或类似的东西来重新使用大缓冲区吗?编辑:感谢您的回答,为了清楚起见,我认为修改后的问题是:如何有

c++ - std::runtime_error::what() 在使用嵌套异常时导致访问冲突

我不是在寻找解决这个问题的方法,只是想了解它的原因。一位同事向我展示了一些代码,这些代码在由VisualStudio2008编译以在WindowsMobile6ARMV4I下运行时会导致访问冲突。同样的代码在x86Windows下运行良好,他声称它在GCC编译的Linux下运行(我尚未验证)。我将问题归结为以下代码:intmain(intargc,char*argv[]){try{throwstd::runtime_error("a");}catch(std::runtime_error&e1){try{try{throwstd::runtime_error("b");}catch(s

C++ DX11 应用程序仅在 Visual Studio IDE 中运行

好吧,我在MSDN论坛上提出了这个问题,但尚未收到任何类型的回复,所以我想我应该试试StackOverflow。我目前正在Win7上使用VS2008开发DirectX应用程序。我最近遇到了一个内存分配类的严重内存损坏错误,该错误会占用字节对齐的内存。在此错误期间,我仍然可以运行调试并发布可执行文件,但是它会由于指令损坏或其他原因而崩溃,但它仍会执行一段时间直到崩溃。然后我剥离了整个内存分配类。该应用程序在IDE(发布和调试版本)中运行完美,但我根本无法运行任何可执行文件。他们立即因无响应/停止工作错误而崩溃。而且我不认为这是我的环境,因为我在另一台之前没有问题的计算机上遇到了同样的问题

c++ - boost Asio : waiting until thread_group has processed all posted tasks?

我有一个对象,一旦创建就会在后台执行许多任务,但应该阻塞直到/所有/发布的任务完成。即:structrun_many{boost::asio::io_servicem_io_service;boost::thread_groupm_threads;boost::asio::signal_setm_signals;voidevaluate(std::stringwork,inti){/*...*/}voidrun_tasks(inttasks,std::stringwork){{boost::asio::io_service::workw(m_io_service);//for(inti

c++ - 如何使用 VS2003 工具集从 VS11 中构建 C++ 项目?

我尝试将适用于VisualC++2005的(工作)平台工具集的拷贝添加到C:\ProgramFiles(x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32\PlatformToolsets\v71,替换所有有道理。但是当我尝试编译我的项目时,输出结果令人失望:1>Microsoft(R)32-bitC/C++OptimizingCompilerVersion13.10.6030for80x861>Copyright(C)MicrosoftCorporation1984-2002.Allrightsreserved.1>1>clÿþ/1>1>c

c++ - 用于快速 std::wstring 分配的自定义分配器

是否有任何开源分配器(可能在Boost中)可以与std::wstring一起使用,实现快速分配模式,如thisblogpost中所示?Boost.Pooldoesn'tseemwellsuitedforthispurpose. 最佳答案 不,没有(我搜索了几个小时,一次)。如果您不关心在使用过程中释放内存,那么您自己做起来相当简单。如果要动态释放,那么freelist管理、LRU等工作就变得很多了。 关于c++-用于快速std::wstring分配的自定义分配器,我们在StackOver

c++ - 在 C++11 中抛出异常时是否使用 move 语义?

http://www.drdobbs.com/cpp/practical-c-error-handling-in-hybrid-env/197003350?pgno=4在这篇文章中,HerbSutter解释说抛出异常需要异常的拷贝,因为它是作为临时创建的,因此使用std::auto_ptr来绕过复制开销。鉴于move语义在C++11中可用,这仍然是必要的吗? 最佳答案 我刚查过,标准允许省略将throw表达式的操作数指定的对象复制或move到异常对象中如果您不以其他方式改变程序的含义(即如果您重新抛出并且随后的捕获会突然看到一个由前

c++ - 从字符串到数字大于 std::numeric_limit<double>::digits10 的 double 的转换

std::stringstr="12345679012.124678";doubleback=boost::lexical_cast(str);std::stringstr2=boost::lexical_cast(back);//herestr2isequaltostr即使数字的有效数字大于std::numeric_limit::digits10(即15),此处也没有丢失(即最终字符串=原始字符串)是否正常? 最佳答案 是的,这很正常。std::numeric_limit::digits10指的是确保强制转换无损的最大位数。这并不

c++ - BlockingQueue 的 QWaitCondition : Destroyed while threads are still waiting

我在Qt中构建了自己的阻塞队列,但遇到了一些问题。如果我不关闭队列,那么我会在控制台中收到错误消息“QWaitCondition:线程仍在等待时已销毁”。另一方面,我在关闭队列后收到访问冲突异常(无论它是在构造函数中还是来自另一个线程)。异常发生在等待条件的wait方法中。这是我的阻塞队列:#ifndefBLOCKING_QUEUE_H#defineBLOCKING_QUEUE_H#include#include#include#include#includenamespaceConcurrency{templateclassBlockingQueue{private:QMutex_m